package common

import (
	"fmt"
	"giv-vue-blog/global"
	"giv-vue-blog/models"
	"gorm.io/gorm"
)

type Option struct {
	models.PageInfo
	Debug bool
	Likes []string //模糊匹配的字段
}

func CommonList[T any](model T, option Option) (list []T, count int64, err error) {
	//默认是没有日志，如果option.Debug==true 则使用日志
	DB := global.DB
	if option.Debug {
		DB = global.DB.Session(&gorm.Session{Logger: global.MysqlLog})
	}
	if option.Sort == "" {
		option.Sort = "created_at desc" //默认按照时间往前排 排序
	}
	DB = DB.Where(model)
	//模糊匹配
	for i, column := range option.Likes {
		if i == 0 {
			DB.Where(fmt.Sprintf("%s like ?", column), fmt.Sprintf("%%%s%%", option.Key)) //and 查询
			continue
		}
		DB.Or(fmt.Sprintf("%s like ?", column), fmt.Sprintf("%%%s%%", option.Key)) //or查询
	}
	//分页查询逻辑
	count = DB.Find(&list).RowsAffected //计算总共有多少条数据
	//这里的query会受到上面的query影响
	query := DB.Where(model)
	offset := (option.Page - 1) * option.Limit //偏移量 (页码-1)*每页的个数
	if option.Limit == 0 {
		option.Limit = -1 //传值-1，就相当于没有这个功能
	}
	if offset < 0 {
		offset = 0
	}
	//分页查询
	//Order(option.Sort) 排序
	err = query.Limit(option.Limit).Offset(offset).Order(option.Sort).Find(&list).Error
	return list, count, err
}
